﻿//******************************************************************************
//    Copyright (c) 2013 INFOGRAM Inc. All Right Reserved.
//
//    SystemName    : 危機管理教育・訓練支援システム
//    CategoryName  : 
//    FileName      : EntityRepository.cs
//    Description   : Base class for all entity business class
//                                                              
//    Created By    : 2012.12.20  Vo Viet Khanh
//    Updated By    : 
//
//******************************************************************************

using System.Collections.Generic;
using System.Data;
using TanWeb.Models.DataAccess.Infrastructure;
using TanWeb.Models.Entities.Infrastructure;

namespace TanWeb.Controllers.Business.Infrastructure
{
    /// <summary>
    /// エンティティビジネスベースクラス
    /// </summary>
    /// <typeparam name="T">エンティティ種類</typeparam>
    public class EntityBusiness<T> : BaseBusiness
        where T : Entity
    {
        //===============================================================
        //  コンストラクタ等宣言
        //===============================================================
        #region /***    Constructor Destructor Declared    ***/
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public EntityBusiness()
            : base()
        {
            this.DataAcces = new EntityDataAccess<T>(this.DbContext);
        }

        /// <summary>
        /// デストラクター
        /// </summary>
        ~EntityBusiness()
        {
            Dispose(false);
        }
        #endregion

        //===============================================================
        //  プロパティ宣言
        //===============================================================
        #region /***    Propertie Declared    ***/
        /// <summary>
        /// データセット
        /// </summary>
        private EntityDataAccess<T> DataAcces { get; set; }
        #endregion

        //===============================================================
        //  パブリックメソッド宣言
        //===============================================================
        #region /***    Public Method Declared    ***/
        /// <summary>
        /// エンティティ挿入
        /// </summary>
        /// <param name="entity">挿入用のエンティティ</param>
        public void Insert(T entity)
        {
            this.DataAcces.Insert(entity);
            this.DbContext.SaveChanges();
        }

        /// <summary>
        /// エンティティ更新
        /// </summary>
        /// <param name="entity">更新用のエンティティ</param>
        public void Update(T entity)
        {
            this.DataAcces.Update(entity);
            this.DbContext.Entry(entity).State = EntityState.Modified;
            this.DbContext.SaveChanges();
        }

        /// <summary>
        /// エンティティ削除
        /// </summary>
        /// <param name="entity">削除用のエンティティ</param>
        public void Delete(T entity)
        {
            this.DataAcces.Delete(entity);
            this.DbContext.Entry(entity).State = EntityState.Modified;
            this.DbContext.SaveChanges();
        }

        /// <summary>
        /// エンティティ一覧を取得する
        /// </summary>
        /// <returns>エンティティ一覧</returns>
        public List<T> GetAll()
        {
            return this.DataAcces.GetAll();
        }

        /// <summary>
        /// 全てのエンティティを数える
        /// </summary>
        /// <returns>エンティティ数</returns>
        public long Count()
        {
            return this.DataAcces.Count();
        }
        #endregion
    }
}
